package com.hopu.haogoumall.core.utils;

import com.github.pagehelper.Page;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Package: com.hopu.haogoumall.core.utils
 * @ClassName: ResponseUtils
 * @Author: xiaoBao
 * @CreateTime: 2020-11-18 17:02
 * @Description: 【请求响应协议工具类】：将操作成功/异常的相关响应数据返回给前端
 */
public class ResponseUtils {
    /**
     * 【操作成功三种响应格式】：1、操作成功不返回对象；2、操作成功并返回对象；3、操作成功并返回数组对象。
     *
     * 【操作失败/异常两种响应格式】：1、操作失败，不返回对象；2、操作失败，并返回自定义数据（对象）。
     *
     * 操作成功或失败的方法均使用static静态关键字来修饰，方便于在其他类中可以直接通过类名.方法名()调用；
     *
     * 操作成功或失败的方法名均使用ok或fail，利用重载的方式来编写响应格式，方法一样，但参数列表不一样。
     */


    /**
     * 【操作成功，不返回数据】
     * @return
     */
    public static Object ok(){
        Map<String,Object> result = new HashMap<>();
        result.put("errno",0);
        result.put("errmsg","成功");
        return result;
    }

    /***
     * 【操作成功，并返回数据（对象）】
     * @param data  数据/对象
     * @return
     */
    public static Object ok(Object data){
        Map<String,Object> dataResult = new HashMap<>();
        dataResult.put("errno",0);
        dataResult.put("errmsg","成功");
        dataResult.put("data",data);
        return dataResult;
    }

    /**
     * 【操作成功，然后调用操作成功并返回数据（包括错误码errno、消息errmsg）的重载方法，传递集合】
     * @param list  需要分页的数据集合 或 一个普通集合
     * @return
     */
    public static Object okList(List list){
        Map<String,Object> listResult = new HashMap<>();
        listResult.put("list",list);
        /**
         * instanceof关键字：判断它左边的对象是否是它右边类的实例，返回的是boolean类型；
         * 判断当前传递的list是否是Page（分页对象）的实例
         */
        if(list instanceof Page){
            /**如果是Page的实例，那么将当前数据集合强转为Page对象（相当于将当前数据集合进行分页）*/
            Page page =(Page) list;

            /**把相关分页的具体信息（例如每页的信息条数、总页数、当前页等）添加进Map集合中*/
            //总记录数（当前页的数据一共有几条）
            listResult.put("total",page.getTotal());
            //总页数
            listResult.put("pages",page.getPages());
            //每页需要显示的数量
            listResult.put("limit",page.getPageSize());
            //当前页
            listResult.put("page",page.getPageNum());
        }
        //最后调用重构方法：操作成功，并返回数据（对象）
        return ok(listResult);
    }


    /**
     * 【操作失败，默认响应数据格式】
     * @return
     */
    public static Object fail(){
        Map<String,Object> result = new HashMap<>();
        result.put("errno",1);
        result.put("errmsg","失败");
        return result;
    }

    /**
     * 【操作失败，并自定义返回数据（对象）】
     * @param errno 错误码
     * @param errmsg 错误信息
     * @return
     */
    public static Object fail(int errno ,String errmsg){
        Map<String,Object> dataResult = new HashMap<>();
        dataResult.put("errno",errno);
        dataResult.put("errmsg",errmsg);
        return dataResult;
    }

}
